//package com.lzh.runke.core.geo;
//
//import com.google.common.collect.Lists;
//import com.rkinf.framework.core.helper.UUIDHelper;
//import lombok.extern.slf4j.Slf4j;
//import net.lingala.zip4j.ZipFile;
//import org.apache.commons.collections4.CollectionUtils;
//import org.apache.commons.io.FileUtils;
//import org.geotools.data.DataStore;
//import org.geotools.data.DataStoreFinder;
//import org.geotools.data.FeatureSource;
//import org.geotools.data.store.ReprojectingFeatureCollection;
//import org.geotools.feature.FeatureCollection;
//import org.geotools.feature.FeatureIterator;
//import org.geotools.referencing.CRS;
//import org.opengis.feature.simple.SimpleFeature;
//import org.opengis.feature.simple.SimpleFeatureType;
//import org.opengis.referencing.FactoryException;
//
//import java.io.File;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * Shape压缩包解析
// */
//@Slf4j
//public class ShapeParser {
//
//    /**
//     * zip 解压shp临时目录
//     */
//    private final static String TEMP_DIR = FileUtils.getTempDirectoryPath() + File.separator + "temp_shp";
//
//    /**
//     * 解析zip压缩包中的shp, 解析所有Feature
//     * @param file
//     * @return 所有Feature WKT
//     */
//    public final static List<String> parseAllAsText(File file) {
//        return parseShp(file, false);
//    }
//
//    /**
//     * 解析zip压缩包中的shp, 解析所有Feature
//     * @param path
//     * @return 所有Feature WKT
//     */
//    public final static List<String> parseAllAsText(String path) {
//        return parseAllAsText(new File(path));
//    }
//
//    /**
//     * 解析zip压缩包中的shp(仅解析第一个要素)
//     * @param file
//     * @return 所有要素WKT
//     */
//    public final static String parseFirstAsText(File file) {
//        List<String> wkts = parseShp(file, true);
//        if(CollectionUtils.isEmpty(wkts)) {
//            return null;
//        }
//        return wkts.get(0);
//    }
//
//    /**
//     * 解析zip压缩包中的shp(仅解析第一个要素)
//     * @param path
//     * @return 所有要素WKT
//     */
//    public final static String parseFirstAsText(String path) {
//        return parseFirstAsText(new File(path));
//    }
//
//    /**
//     * 解析zip压缩包中的shp
//     * @param file zip文件
//     * @param onlyFirst 是否只解析第一个要素
//     * @return 所有要素WKT
//     */
//    private final static List<String> parseShp(File file, boolean onlyFirst) {
//        File tempShpDir = null;
//        try {
//            tempShpDir = unzipShpToTemp(file);
//            File firstShp = findFirstShpDir(tempShpDir);
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("url", firstShp.toURI().toURL());
//
//            DataStore dataStore = DataStoreFinder.getDataStore(map);
//
//            String[] typeNames = dataStore.getTypeNames();
//            if(null == typeNames || typeNames.length < 1) {
//                return new ArrayList<>(0);
//            }
//            List<String> parsedFeatures = Lists.newLinkedList();
//            for(String typeName: typeNames) {
//                FeatureSource<SimpleFeatureType, SimpleFeature> source = dataStore.getFeatureSource(typeName);
//                FeatureCollection<SimpleFeatureType, SimpleFeature> collection = new ReprojectingFeatureCollection(source.getFeatures(), CRS.decode("EPSG:4326"));
//                FeatureIterator<SimpleFeature> featureIterator = collection.features();
//                while (featureIterator.hasNext()) {
//                    SimpleFeature feature = featureIterator.next();
//                    parsedFeatures.add(feature.getDefaultGeometryProperty().getValue().toString());
//                    if(onlyFirst) {
//                        break;
//                    }
//                }
//                featureIterator.close();
//                if(onlyFirst) {
//                    break;
//                }
//            }
//            return parsedFeatures;
//        } catch (IOException | FactoryException e) {
//            log.warn("解析shp zip压缩包异常: {}", e);
//            e.printStackTrace();
//            return null;
//        } finally {
//            if(tempShpDir != null) {
//                try {
//                    FileUtils.deleteDirectory(tempShpDir);
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//
//    /**
//     * 解压shp文件到临时目录
//     * @param file
//     * @return
//     * @throws IOException
//     */
//    private final static File unzipShpToTemp(File file) throws IOException {
//        ZipFile zipFile = null;
//        try {
//            zipFile = new ZipFile(file);
//            File tempShpDir = new File(TEMP_DIR + File.separator + UUIDHelper.randomUUID());
//            if (!tempShpDir.exists()) {
//                tempShpDir.mkdirs();
//            }
//            zipFile.extractAll(tempShpDir.getAbsolutePath());
//            return tempShpDir;
//        } finally {
//            if(zipFile != null) {
//                zipFile.close();
//            }
//        }
//    }
//
//    /**
//     * 递归查找第一个有shp文件的目录(暂时只解析第一个包含shp文件的目录，后续如有需求再扩展遍历所有)
//     * @param dir
//     * @return
//     */
//    private final static File findFirstShpDir(File dir) {
//        File[] files = dir.listFiles();
//        if(files != null && files.length > 0) {
//            for(File file: files) {
//                if(file.isFile()) {
//                    if(file.getName().endsWith(".shp")) {
//                        return file.getParentFile();
//                    }
//                    continue;
//                }
//                return findFirstShpDir(file);
//            }
//        }
//        return dir;
//    }
//}
